package it.unicam.ids.pvm.postazione;

import it.unicam.ids.pvm.data.DAOException;
import it.unicam.ids.pvm.distributore.Casella;
import it.unicam.ids.pvm.distributore.DistributoreAutomatico;
import it.unicam.ids.pvm.distributore.Espositore;
import it.unicam.ids.pvm.distributore.Lato;
import it.unicam.ids.pvm.distributore.Prodotto;

/**
 * La classe rappresenta una delle due possibili postazioni 
 * adibite alla vendita, presenti nel distributore.
 * Contiene i seguenti attributi:
 * lato, differenzia le due possibili postazioni;
 * lettoreChiavetta, lettore per chiavette associato 
 * alla postazione;
 * gestoreContati, gestore del credito associato 
 * alla postazione;
 * distributore, riferimento al distributore automatico;
 * nastro, riferimento al nastro presente nella postazione.
 * @author Luca Iachini, Valerio Iachini, Alessandro Cardenà
 *
 */
public class PostazioneDiVendita {
	
	private Lato lato;
	private LettoreChiavetta lettoreChiavetta;
	private GestoreContanti gestoreContanti;
	private DistributoreAutomatico distributore;
	private Nastro nastro;

	/**
	 * Costruttore della classe.
	 * Inizalizza tutti i propri attributi.
	 * @param lato lato della postazione.
	 * @param distributore.
	 * @throws DAOException
	 */
	
	public PostazioneDiVendita(Lato lato, DistributoreAutomatico distributore) throws DAOException {
		this.setLato(lato);
		lettoreChiavetta = new LettoreChiavetta(this);
		gestoreContanti = new GestoreContanti(this);
		this.distributore = distributore;
		nastro=new Nastro(lato);
	}
	
	/**
	 * Il metodo consente di acquistare un prodotto solo se 
	 * il distributore non è in manutenzione, il prodotto è 
	 * disponibile e il credito inserito non sia inferiore 
	 * al prezzo del prodotto scelto.
	 * @param etichetta codice per la casella con  il prodotto.
	 * @throws CreditoInsufficienteException.
	 * @throws Exception messaggio d'errore relativo 
	 * 						all'acquisto del prodotto.
	 */

	public void acquistaProdotto(String etichetta) throws CreditoInsufficienteException,Exception { //TODO
		if (distributore.getStato() == DistributoreAutomatico.Stato.MANUTENZIONE)
			throw new Exception("Distributore in manutenzione");
		Casella casella = Espositore.getInstance().getCasella(etichetta);
		if (casella == null)
			throw new Exception("Casella non trovata");
		Prodotto prodotto = casella.getProdotto();
		if(prodotto== null)
			throw new Exception("Prodotto non disponibile");
		double prezzo = prodotto.getPrezzo();
		if (lettoreChiavetta.isInserita()) {
			double sconto = prodotto.getPromozione();
			lettoreChiavetta.paga(prezzo - (prezzo * sconto));
		}
		else
			gestoreContanti.paga(prezzo);
		distributore.erogaProdotto(etichetta, lato);
	}

	/**
	 * Il metodo consente di ottenere tutte le informazioni 
	 * sul prodotto selezionato.
	 * @param etichetta codice della casella con il prodotto.
	 * @return prodotto.
	 * @throws DAOException.
	 */
	
	public Prodotto visualizzaInfoProdotto(String etichetta) throws DAOException {
		return Espositore.getInstance().getCasella(etichetta).getProdotto();
	}

	/**
	 * Il metodo restituisce il lettore delle chiavette.
	 * @return lettoreChiavetta.
	 */
	
	public LettoreChiavetta getLettoreChiavetta() {
		return lettoreChiavetta;
	}
	
	/**
	 * Il metodo restituisce il gestore del credito.
	 * @return gestoreContanti.
	 */

	public GestoreContanti getGestoreContanti() {
		return gestoreContanti;
	}
	
	/**
	 * Il metodo imposta il lato della postazione.
	 * @param lato.
	 */

	public void setLato(Lato lato) {
		this.lato = lato;
	}
	
	/**
	 * Il metodo restituisce il lato della postazione.
	 * @return lato.
	 */

	public Lato getLato() {
		return lato;
	}
	
	/**
	 * Il metodo restituisce il nastro della postazione.
	 * @return nastro.
	 */
	
	public Nastro getNastro(){
		return nastro;
	}
	
}